﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.IO;

namespace Pittypat.Web
{
    /// <summary>
    /// 表示一个要发送给客户端的 <see cref="IJson"/> 值的消息。
    /// </summary>
    class ValueMessage : Message
    {
        // 目标值
        private IJson value;

        /// <summary>
        /// 使用 <see cref="IJson"/> 值初始化 <see cref="ValueMessage"/> 类的新实例。
        /// </summary>
        /// <param name="value">要发送的值。可以为 null，此时发送一个 <see cref="EmptyMessage"/>。</param>
        internal ValueMessage(IJson value)
        {
            this.value = value;
        }

        /// <summary>
        /// 获取消息中包含的值。可以为 null，此时发送一个 <see cref="EmptyMessage"/>。
        /// </summary>
        public IJson Value
        {
            get
            {
                return this.value;
            }
            internal set
            {
                this.value = value;
            }
        }

        /// <summary>
        /// 获取消息中包含值的类型名称。如果值为 null，则返回 null。
        /// </summary>
        internal string ValueTypeName
        {
            get
            {
                return this.value == null ? "null" : Json.GetTypeName(this.value);
            }
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="ArgumentNullException">writer 是 null。</exception>
        public override void Write(TextWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            if (this.value == null)
            {
                writer.Write("{\"type\":\"empty\"}");
            }
            else
            {
                writer.Write("{{\"type\":\"value\",\"valueType\":\"{0}\",\"value\":", this.ValueTypeName);
                this.value.Write(writer);
                writer.Write('}');
            }
        }

        /// <summary>
        /// 将当前对象转换字符串格式
        /// </summary>
        /// <returns>对象的字符串表示形式。</returns>
        public override string ToString()
        {
            using (var writer = new StringWriter())
            {
                this.Write(writer);

                return writer.ToString();
            }
        }
    }
}
